package com.feiclub.subject.common.entity;

import lombok.Data;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * 分页返回实体
 *
 * @author: ChickenWing
 * @date: 2023/10/5
 */
@Data
public class PageResult<T>  implements Serializable {
    //    定义了一个名为 PageResult 的泛型类，它用于封装分页查询的结果

    // 表示当前页码，默认为1。
    private Integer pageNo = 1;
    //表示每页显示的记录数，默认为20。
    private Integer pageSize = 20;
    //    表示总记录数。
    private Integer total = 0;
    //    表示总页数。
    private Integer totalPages = 0;
    //表示当前页的记录列表，使用Collections.emptyList()初始化以提供不可修改的空列表。
    private List<T> result = Collections.emptyList();
    //    表示当前页第一条记录的起始索引。
    private Integer start = 1;
    //    表示当前页最后一条记录的结束索引。
    private Integer end = 0;

    //    用于设置当前页的记录列表，并根据列表大小更新总记录数。
    public void setRecords(List<T> result) {
        this.result = result;
        if (result != null && result.size() > 0) {
//           总记录数>0             给属性赋值  比如20
            setTotal(result.size());
        }
    }

    //    并根据pageSize和total计算总页数。同时，它还更新了start和end属性，以表示当前页的记录范围。
    public void setTotal(Integer total) {
//        20就为总数据长度
        this.total = total;
//        每页显示的记录数>0     在调用时 setRecords  已经有值
        if (this.pageSize > 0) {
            //举个例子，如果 total 是 17，this.pageSize 是 10，那么：
            //17 / 10 = 1（完整页）
            //17 % 10 = 7（剩余记录数）
            //因为有余数，所以 (17 % 10 == 0 ? 0 : 1) 的结果是 1。
            //所以，总页数 totalPages 将会是 1 + 1 = 2，表示需要两页来显示所有记录。
            this.totalPages = (total / this.pageSize) + (total % this.pageSize == 0 ? 0 : 1);
        } else {
            this.totalPages = 0;
        }
//        计算起始索引 start和节数索引end
//        举个例子，如果 pageNo 是3，pageSize 是10，那么：
        //start 的计算：(3−1)×10+1=21
        //(3−1)×10+1=21，表示当前页的第一条记录的索引是21。
        //        end 的计算：(21−1)+10×1=30
//      (21−1)+10×1=30，表示当前页的最后一条记录的索引是30。
        this.start = (this.pageSize > 0 ? (this.pageNo - 1) * this.pageSize : 0) + 1;
        this.end = (this.start - 1 + this.pageSize * (this.pageNo > 0 ? 1 : 0));
    }

    //    用于设置每页显示的记录数。
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    //    用于设置当前页码。
    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }

}
